iT邦幫忙

2022 iThome 鐵人賽

DAY 30
0
AI & Data

預測惱人的人事物:跟我一起學習如何用資料分析來避開他們系列 第 30

輸出儲存的記錄 & 安裝 app 於實體手機

  • 分享至 

  • xImage
  •  

進度

今天預計將 Required 的部分處理完畢!

1. Required

  1. 實際依照星期幾來通知
  2. 輸出記錄的資料
  3. 打包成 apk 在實體機載入

2. Optional

  1. UI 的按鈕優化
  2. 新增 App 圖示

輸出所有記錄

目前 getAllStoredRecords 的功能,只是透過 Alert 顯示儲存的訊息而已,並沒有處理到訊息輸出的部分。讓我們修改如下:

export const getAllStoredRecords = async () => {
  const keys = await getAllKeys();

  const records = await Promise.all(
    keys.map(async key => {
      const value = await getData(key);
      return {key, value};
    }),
  );

  const formattedRecords = JSON.stringify(records);

  return formattedRecords;
};

筆者調查了以後,發現 React Native 提供的 Share API 可以達成我們外部輸出的需求。

然而,若按照官方的文件實作,會跳出我們沒有提供 url 或是 message 的錯誤

export const shareStoredRecords = async () => {
  const message = await getAllStoredRecords();

  try {
    await Share.share({
      message,
    });
  } catch (error) {
    console.error(error.message);
  }
};

看了一下型別,確定我們沒有帶錯:

export type ShareContent =
    | {
          title?: string | undefined;
          message: string;
      }
    | {
          title?: string | undefined;
          url: string;
      };

理論上,我們只要提供 url 或是 message 擇一就可以了,這邊有 bug。

嘗試了一陣子後,筆者參照了這篇 stackoverflow,再試試看幾種組合之後,發現以下這種寫法可以順利輸出,也順道留言提供解法:

export const shareStoredRecords = async () => {
  const message = await getAllStoredRecords();

  try {
    await Share.share({
      message,
      url: message,
    });
  } catch (error) {
    console.error(error.message);
  }
};

接著我們在 App.js 建立一個按鈕,其 onPress 的動作是執行 shareStoredRecords
https://ithelp.ithome.com.tw/upload/images/20221015/20141357O8XbyqNkls.png

功能完成!


附帶處理:確認刪除資料

筆者預計在正式環境保留一鍵刪除資料的功能。

原因在於如果我們已經輸出資料了,可以透過這個功能將本地的資料清空,避免將來重複輸出

但今天發現刪除所有儲存的資料之前,沒有確認的步驟,似乎有點危險。所以我們在 AnnoyancePrediction/src/asyncStorage.js 加入以下的 function 吧:

export const confirmClearAll = async () => {
  Alert.alert('刪除資料', '確定是否要刪除嗎?', [
    {
      text: '取消',
      style: 'cancel',
    },
    {text: '確認刪除!', onPress: clearAll, style: 'destructive'},
  ]);
};

然後讓我們回到 App.js 把原先按鈕對應的 clearAll 替換成 confirmClearAll,如此在正式環境就不會不小心手殘刪除了!


建立 apk 檔 & 實體安裝

今天的重頭戲,讓我們在手機裝上寫好的 app 來使用吧。

依照官方將 app 發佈到 Google Play Store 的文件操作即可,筆者將步驟整理如下:

  1. 建立 upload key
    1. 筆者使用的是 Macbook,依照此段指示建立:連結

    2. 找到 JDK 的目錄,在該目錄底下用官網的指令生成 key。

    3. 生成的過程中,會問你密碼為何,這邊需要記下來,之後的步驟用得到,其他資訊為選填。
      https://ithelp.ithome.com.tw/upload/images/20221015/20141357Mpjle4539C.png

    4. 將這把 key 移到我們專案中 AnnoyancePrediction/android/app 底下

  2. 建立 gradle.properties
    1. 在 home directory 的 .gradle 資料夾建立 gradle.properties。路徑 /Users/<你的名字>/.gradle
    2. 不建議使用我們的專案中 AnnoyancePrediction/android/gradle.properties,因為這個檔案會被 git 追蹤,有資安風險。
    3. 編輯 gradle.properties,加入這四行:
      MYAPP_UPLOAD_STORE_FILE=my-upload-key.keystore
      MYAPP_UPLOAD_KEY_ALIAS=my-key-alias
      MYAPP_UPLOAD_STORE_PASSWORD=<剛剛 key 填的密碼>
      MYAPP_UPLOAD_KEY_PASSWORD=<剛剛 key 填的密碼>
      
  3. 修改 Gradle config
    1. 需注意是 android/app/build.gradle,而不是 android/build.gradle
    2. 找到程式碼中 android 的 block,依照官方的指示,修改裡面的 properties。注意,官方的指示中有 ... 為省略符號,不需要加入。
  4. bundle 並建立 release 版本
    1. 回到 AnnoyancePrediction/android,在 terminal 輸入 ./gradlew bundleRelease
    2. 接著輸入 npx react-native run-android --variant=release
  5. build 完以後,我們可以取得 apk 檔實測。apk 檔在以下路徑:AnnoyancePrediction/android/app/build/outputs/apk/release

接著我們透過雲端或是有線的方式,將 apk 檔傳到手機上安裝吧!

安裝完成後打開,首先碰到我們之前設置的背景執行限制詢問:
https://ithelp.ithome.com.tw/upload/images/20221015/20141357uH9KOuSp2a.jpg

手機上的 UI:
https://ithelp.ithome.com.tw/upload/images/20221015/20141357x7G2rrIIVJ.jpg
背景有破圖。

通知順利在預期時間前 10 分鐘發出:
https://ithelp.ithome.com.tw/upload/images/20221015/20141357vrM1dZeYzT.jpg

Icon 的部分沒有調整,為 React Native 預設的:
https://ithelp.ithome.com.tw/upload/images/20221015/20141357JjpAxJtrgP.jpg

反思

筆者發現我們目前記錄的功能,一天只能記錄一筆。若早上以及晚上都需要記錄,此功能將會不敷使用。

除此之外,UI 的部分,背景有破圖需要處理。

故我們新增 optional 的需求:

  1. 修復 UI 背景破圖
  2. 記錄不同筆關門聲

目前進度

1. Required

  1. 實際依照星期幾來通知
  2. 輸出記錄的資料
  3. 打包成 apk 在實體機載入

2. Optional

  1. UI 的按鈕優化
  2. 新增 App 圖示
  3. 修復 UI 背景破圖
  4. 記錄不同筆關門聲

回顧一下 Day 23 總結的需求:

  1. 希望可以在關門前,可能前十分鐘,透過某個平台發出一個推播通知,告訴我可能樓下馬上準備要關門了
  2. 可以不斷累積新資料
  3. 如果可以,會希望有一個界面,可以快速增加開門聲的記錄

以上需求皆已達成!

鐵人賽 30 天的部分正式完成了!

不過筆者會繼續寫下去,直到上述的 optional 的需求達成為止。

今天收工!


上一篇
實作:依照星期幾之不同,在特定時間通知
下一篇
新增 App 圖示 & UI 的按鈕優化
系列文
預測惱人的人事物:跟我一起學習如何用資料分析來避開他們38
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言